/*=============================================================================
**                              LINDBOARD
**                            Copyright 2014
**-----------------------------------------------------------------------------
** Supported MCUs      : MCU STM32F103
** Supported Compilers : Compiler independent
**-----------------------------------------------------------------------------
** File name         : input.c
**
** Module name       : input
**
** Requirement specification : 
**
** Summary: input reader
**
**= History ====================================================================
** 01.00  17/07/2014  Cuong Chu
** -  Creation
==============================================================================*/
/*****************************************************************************/
/* INCLUSIONS                                                                */
/*****************************************************************************/
#include "input.h"
/*****************************************************************************/
/* DEFINATION OF CONST                                                       */
/*****************************************************************************/
#define RCC_GPIOA                                 2                    
#define RCC_GPIOB                                 3
#define RCC_GPIOC                                 4
#define RCC_GPIOD                                 5
#define RCC_GPIOE                                 6
/*****************************************************************************/
/* DEFINATION OF INTERNNAL VARIABLE OF MODULE                                */
/*****************************************************************************/
static const uint8_t PinIndex[] =
{
   2 , /* P1  */
   3 , /* P2  */
   4 , /* P3  */
   5 , /* P4  */
   6 , /* P5  */
   13, /* P6  */
   14, /* P7  */
   15, /* P8  */
   0 , /* P9  */
   1 , /* P10 */
   2 , /* P11 */
   3 , /* P12 */
   0 , /* P13 */
   1 , /* P14 */
   2 , /* P15 */
   3 , /* P16 */
   4 , /* P17 */
   5 , /* P18 */
   6 , /* P19 */
   7 , /* P20 */
   4 , /* P21 */
   5 , /* P22 */
   0 , /* P23 */
   1 , /* P24 */
   7 , /* P25 */
   8 , /* P26 */
   9 , /* P27 */
   10, /* P28 */
   11, /* P29 */
   12, /* P30 */
   13, /* P31 */
   14, /* P32 */
   15, /* P33 */
   10, /* P34 */
   11, /* P35 */
   12, /* P36 */
   13, /* P37 */
   14, /* P38 */
   15, /* P39 */
   8 , /* P40 */
   9 , /* P41 */
   10, /* P42 */
   11, /* P43 */
   12, /* P44 */
   13, /* P45 */
   14, /* P46 */
   15, /* P47 */
   6 , /* P48 */
   7 , /* P49 */
   8 , /* P50 */
   9 , /* P51 */
   8 , /* P52 */
   9 , /* P53 */
   10, /* P54 */
   11, /* P55 */
   12, /* P56 */
   10, /* P57 */
   11, /* P58 */
   12, /* P59 */
   0 , /* P60 */
   1 , /* P61 */
   2 , /* P62 */
   3 , /* P63 */
   4 , /* P64 */
   7 , /* Keypad C0 */
   6 , /* Keypad C1 */
   5 , /* Keypad C2 */
   4 , /* Keypad C3 */
   5 , /* Mode Auto */
   6   /* Mode Manual */
}; 
static GPIO_TypeDef* GPIOx[] =
{
  GPIOE , /* P1  */
  GPIOE , /* P2  */
  GPIOE , /* P3  */
  GPIOE , /* P4  */
  GPIOE , /* P5  */
  GPIOC , /* P6  */
  GPIOC , /* P7  */
  GPIOC , /* P8  */
  GPIOC , /* P9  */
  GPIOC , /* P10 */
  GPIOC , /* P11 */
  GPIOC , /* P12 */
  GPIOA , /* P13 */
  GPIOA , /* P14 */
  GPIOA , /* P15 */
  GPIOA , /* P16 */
  GPIOA , /* P17 */
  GPIOA , /* P18 */
  GPIOA , /* P19 */
  GPIOA , /* P20 */
  GPIOC , /* P21 */
  GPIOC , /* P22 */
  GPIOB , /* P23 */
  GPIOB , /* P24 */
  GPIOE , /* P25 */
  GPIOE , /* P26 */
  GPIOE , /* P27 */
  GPIOE , /* P28 */
  GPIOE , /* P29 */
  GPIOE , /* P30 */
  GPIOE , /* P31 */
  GPIOE , /* P32 */
  GPIOE , /* P33 */
  GPIOB , /* P34 */
  GPIOB , /* P35 */
  GPIOB , /* P36 */
  GPIOB , /* P37 */
  GPIOB , /* P38 */
  GPIOB , /* P39 */
  GPIOD , /* P40 */
  GPIOD , /* P41 */
  GPIOD , /* P42 */
  GPIOD , /* P43 */
  GPIOD , /* P44 */
  GPIOD , /* P45 */
  GPIOD , /* P46 */
  GPIOD , /* P47 */
  GPIOC , /* P48 */
  GPIOC , /* P49 */
  GPIOC , /* P50 */
  GPIOC , /* P51 */
  GPIOA , /* P52 */
  GPIOA , /* P53 */
  GPIOA , /* P54 */
  GPIOA , /* P55 */
  GPIOA , /* P56 */
  GPIOC , /* P57 */
  GPIOC , /* P58 */
  GPIOC , /* P59 */
  GPIOD , /* P60 */
  GPIOD , /* P61 */
  GPIOD , /* P62 */
  GPIOD , /* P63 */
  GPIOD , /* P64 */
  GPIOC , /* Keypad C0 */
  GPIOC , /* Keypad C1 */
  GPIOC , /* Keypad C2 */
  GPIOC , /* Keypad C3 */
  GPIOA , /* Mode Auto */
  GPIOA   /* Mode Manual */
}; 
/*****************************************************************************/
/* DEFINATION OF GLOBAL FUNCTION                                             */
/*****************************************************************************/
/******************************************************************************
** Function Name: INPUT_IOEnableClock(void)
** Description  : The function enbales clock for all GPIOs
** Parameter    : None
** Return       : None
** Note         : 
******************************************************************************/
void INPUT_IOEnableClock
(
  void
)
{
  /* enable GPIOA,GPIOB,GPIOC,GPIOD,GPIOE clock */
  RCC->APB2ENR |= 1UL << RCC_GPIOA;
  RCC->APB2ENR |= 1UL << RCC_GPIOB;
  RCC->APB2ENR |= 1UL << RCC_GPIOC;
  RCC->APB2ENR |= 1UL << RCC_GPIOD;
  RCC->APB2ENR |= 1UL << RCC_GPIOE;
} 

/******************************************************************************
** Function Name: INPUT_InputInit()
** Description  : The function inits input selected channel
** Parameter    : IN_CH_1 ... IN_CH_2
** Return       : None
** Note         : 
******************************************************************************/
void INPUT_InputInit
(
  INPUT_InputType channel
)
{
  /* check pin select at low or high register */
  if(PinIndex[channel]<8)
  {
    /* set pin mode input push pull input */
    GPIOx[channel]->CRL   &= ~(3UL << (PinIndex[channel]*4+2));
    GPIOx[channel]->CRL   |= 2UL << (PinIndex[channel]*4+2);
    GPIOx[channel]->CRL   &= ~(3UL << PinIndex[channel]*4);
  }
  else
  {
    /* set pin mode floating input */
    GPIOx[channel]->CRH   &= ~(3UL << ((PinIndex[channel]-8)*4+2));
    GPIOx[channel]->CRH   |= 2UL << ((PinIndex[channel]-8)*4+2);
    GPIOx[channel]->CRH   &= ~(3UL << ((PinIndex[channel]-8)*4));
  }
}
/******************************************************************************
** Function Name: INPUT_BuzzerEnable()
** Description  : The function reads input selected channel
** Parameter    : IN_CH_1 ... IN_CH_2
** Return       : STD_LOW or STD_HIGH 
** Note         : 
******************************************************************************/
COMST32_LogicLevel INPUT_ReadInput
(
  INPUT_InputType channel
)
{
  COMST32_LogicLevel RetVal;
  /* read state of input on odr register */
  if((GPIOx[channel]->IDR >> PinIndex[channel])& 1UL)
  {
    RetVal = STD_HIGH;
  }
  else 
  {
    RetVal = STD_LOW;
  }
  return RetVal;
}
/*****************************************************************************/
/* End Of File Copyright LINDBOARD 2014                                      */
/*****************************************************************************/
